package com.car.advertising.map;

import android.content.Context;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationClientOption.AMapLocationMode;
import com.amap.api.location.AMapLocationListener;
import com.support.widget.util.LogUtil;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 开发者：LuoYi
 * Time: 2017 15:24 2017/4/5 04
 */

public class GaoDeMap {

    //声明AMapLocationClient类对象
    public AMapLocationClient mLocationClient = null;
    //声明AMapLocationClientOption对象
    public AMapLocationClientOption mLocationOption = null;

    public static GaoDeMap instance = null;

    /**
     * 获取CrashHandler实例 ,单例模式
     */
    public static GaoDeMap getInstance() {
        if (instance == null) {
            instance = new GaoDeMap();
        }
        return instance;
    }

    public void initMap(Context context) {
        //初始化定位
        mLocationClient = new AMapLocationClient(context);
        //设置定位回调监听
        mLocationClient.setLocationListener(mLocationListener);

        //初始化AMapLocationClientOption对象
        mLocationOption = new AMapLocationClientOption();
        /*
         * 设置定位模式:
         *          AMapLocationMode.Hight_Accuracy，高精度模式
         *          AMapLocationMode.Battery_Saving，低功耗模式
         *          AMapLocationMode.Device_Sensors，仅设备模式
         */
        mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);

        //获取一次定位结果：
        //该方法默认为false。
        mLocationOption.setOnceLocation(true);

        //获取最近3s内精度最高的一次定位结果：
        //设置setOnceLocationLatest(boolean b)接口为true，启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true，setOnceLocation(boolean b)接口也会被设置为true，反之不会，默认为false。
        mLocationOption.setOnceLocationLatest(true);
        //设置定位间隔,单位毫秒,默认为2000ms，最低1000ms。
//        mLocationOption.setInterval(1000);
        //设置是否返回地址信息（默认返回地址信息）
        mLocationOption.setNeedAddress(true);
        //设置是否强制刷新WIFI，默认为true，强制刷新。
//        mLocationOption.setWifiActiveScan(true);
        //设置是否允许模拟位置,默认为false，不允许模拟位置
//        mLocationOption.setMockEnable(false);
        //单位是毫秒，默认30000毫秒，建议超时时间不要低于8000毫秒。
//        mLocationOption.setHttpTimeOut(20000);
        //关闭缓存机制
        mLocationOption.setLocationCacheEnable(false);
        //给定位客户端对象设置定位参数
        mLocationClient.setLocationOption(mLocationOption);
        //启动定位
        mLocationClient.startLocation();
    }

    //声明定位回调监听器
    public AMapLocationListener mLocationListener = new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
            if (aMapLocation != null) {
                if (aMapLocation.getErrorCode() == 0) {
                    //可在其中解析aMapLocation获取相应内容。
                    getMapLocation(aMapLocation);
                } else {
                    //定位失败时，可通过ErrCode（错误码）信息来确定失败的原因，errInfo是错误信息，详见错误码表。
                    LogUtil.e("location Error, ErrCode:" + aMapLocation.getErrorCode() + ", errInfo:" + aMapLocation.getErrorInfo());
                }
            }
        }
    };

    public void getMapLocation(AMapLocation amapLocation) {
        LogUtil.i(amapLocation.getLocationType());//获取当前定位结果来源，如网络定位结果，详见定位类型表
        LogUtil.i(amapLocation.getLatitude());//获取纬度
        LogUtil.i(amapLocation.getLongitude());//获取经度
        LogUtil.i(amapLocation.getAccuracy());//获取精度信息
        LogUtil.i(amapLocation.getAddress());//地址，如果option中设置isNeedAddress为false，则没有此结果，网络定位结果中会有地址信息，GPS定位不返回地址信息。
        LogUtil.i(amapLocation.getCountry());//国家信息
        LogUtil.i(amapLocation.getProvince());//省信息
        LogUtil.i(amapLocation.getCity());//城市信息
        LogUtil.i(amapLocation.getDistrict());//城区信息
        LogUtil.i(amapLocation.getStreet());//街道信息
        LogUtil.i(amapLocation.getStreetNum());//街道门牌号信息
        LogUtil.i(amapLocation.getCityCode());//城市编码
        LogUtil.i(amapLocation.getAdCode());//地区编码
        LogUtil.i(amapLocation.getAoiName());//获取当前定位点的AOI信息
        LogUtil.i(amapLocation.getBuildingId());//获取当前室内定位的建筑物Id
        LogUtil.i(amapLocation.getFloor());//获取当前室内定位的楼层
//        amapLocation.getGpsStatus();//获取GPS的当前状态
//获取定位时间
        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date(amapLocation.getTime());
        LogUtil.i(df.format(date));
    }

    public void stopMap() {
        mLocationClient.stopLocation();//停止定位后，本地定位服务并不会被销毁
    }

    public void destroyMap() {
        mLocationClient.onDestroy();//销毁定位客户端，同时销毁本地定位服务。
    }

}
